export const formatQuestionnaire = q => ({
  id: q.id,
  title: q.title,
  desc: q.description,
  place: q.place, // 发布位置
  replyCount: q.reply_count, // 答卷数

  questions: q.questionnaire_items,

  released: q.deliver, // 已发布
  releasedGroupsId: q.place_ids || [], // 发布到哪些群组了

  key: q.signature,

  owner: q.user ? {
    id: q.user.id,
    nickname: q.user.nickname,
    avatar: q.user.avatar,
  } : {},

  created_at: q.created_at,
  updated_at: q.updated_at,
});

export const formatQuestionnaires = qs => qs.map(q => formatQuestionnaire(q));

export const initAnswers = questions => questions.map((question) => {
  switch (question.type) {
    case 1: return ''; // 单选题绑定字符串
    case 2: return []; // 多选题绑定数组
    case 3: return ''; // 问答题绑定字符串
    default: return '';
  }
});

export const defaultOptions = [
  { index: 1, title: '', fill: false },
  { index: 2, title: '', fill: false },
  { index: 3, title: '', fill: false },
];

export const defaultQuestions = [
  // index: 第几题
  // type: 问题类型 1.单选 2.多选 3.问答
  { index: 1, title: '', type: 1, options: defaultOptions },
  { index: 2, title: '', type: 2, options: defaultOptions },
  { index: 3, title: '', type: 3, options: defaultOptions },
];

export const formatQuestions = questions => questions.map((question, index) => ({
  id: question.id, // 更新的时候有id，创建的时候没有这一项
  index: index + 1,
  title: question.title.trim() || '未设置标题',
  type: question.type,
  options: question.options ? question.options.map((option, index2) => ({
    index: index2 + 1,
    title: option.title.trim() || `选项${index2 + 1}`,
    fill: option.fill,
    value: option.fill ? option.value || '' : undefined,
  })) : undefined,
}));

const findFillAndAssign = ({ index, questionId, selectedValue, options, fills, answersObj }) => {
  // index 是这个问题所在位置（从0开始）
  const optionIndex = selectedValue - 1; // selectedValue 是选择的第几题（从1开始），这里转换成选项数组中的第几个（从0开始）
  const isFillOption = options[optionIndex].fill; // 选项数组中对应位置的选项是不是可填的
  const fillValue = fills[index][selectedValue] || ''; // 从填空数据中找题目对应位置（从0开始）的对应选项（按值搜索）的填空值
  const validFillValue = fillValue.trim();
  Object.assign(answersObj[questionId].answer, { [selectedValue]: isFillOption ? validFillValue : '' });
};

// 将填空内容和选项结合到一起
export const formatAnswers = (questions, answers, fills) => {
  const answersObj = {};
  questions.forEach((question, index) => {
    const questionId = question.id; // 这一题的id
    const options = question.options; // 这一题有哪些选项
    if (question.type === 1) { // 单选题时
      if (answers[index]) { // 当answers数组的对应位置有答案时
        Object.assign(answersObj, // 标记这一题有答案，并填入这一题的类型
          { [questionId]: { index: question.index, type: 1, answer: {} } },
        );
        const selectedValue = answers[index]; // 选择了第几个选项（从1开始）（单选题的值）
        findFillAndAssign({ index, questionId, selectedValue, options, fills, answersObj });
      }
    }
    if (question.type === 2) { // 多选题时
      if (answers[index].length) { // 当answer数组对应位置的多选数组有长度（有选择项）时
        Object.assign(answersObj, // 标记这一题有答案，并填入这一题的类型
          { [questionId]: { index: question.index, type: 2, answer: {} } },
        );
        const selectedValues = answers[index]; // 选择了哪些选项（[1,2]：选择了第一个选项和第二个选项）
        selectedValues.forEach((selectedValue) => {
          findFillAndAssign({ index, questionId, selectedValue, options, fills, answersObj });
        });
      }
    }
    if (question.type === 3) { // 问答题时
      if (answers[index].trim()) { // 当answers数组的对应位置有答案时
        Object.assign(answersObj, { // 标记这一题有答案，并填入这一题的类型
          [questionId]: { index: question.index, type: 3, answer: answers[index].trim() },
        });
      }
    }
  });
  return answersObj;
};
